export type FileInfosType = Array<{
  fileFullName: string
  path: string
  fileName: string
  fileType: string
}>

export type ExpandedType = 'expanded' | 'collapsed' | 'none'

export type FolderType = 'Note' | 'Mind' | 'Task'

/**
 * 通用文件状态结构
 */
export interface FileBaseState {
  /** 当前文件夹路径 */
  folderPath: string
  /** 当前文件夹下的文件列表 */
  files: FileInfosType
  /** 当前打开的文件 */
  currentFile: FileInfosType[number] | null
  /** 文件树展开状态 */
  expanded: ExpandedType
}

/**
 * 根 Store 结构
 */
export interface FileStateType {
  /** 当前Type */
  curType: FolderType
  /** 当前使用的文件夹state */
  curState: FileBaseState
  /** Note 文件内容 */
  noteContent: string
  /** Mind 文件内容 */
  mindContent: string

  /** 重命名相关字段 */
  renamef: {
    /** 输入框的重命名值 */
    renameValue: string
    /** 新建文件时的文件名 */
    newFileName: string
    /** 正在重命名的路径 */
    renamingPath: string
  }

  /** 是否正在创建新文件 */
  isCreatingFile: boolean

  /**
   * 设置当前 Store（Note 或 Mind）
   * @param v 'Note' | 'Mind'
   */
  setCurStore: (
    options: {
      type?: FolderType
    } & Partial<FileBaseState>
  ) => void

  /** 选择文件夹 */
  chooseFolder: () => Promise<void>

  /** 打开文件 */
  openFile: (openFile: FileInfosType[number]) => Promise<void>

  /** 删除文件 */
  deleteFile: (filePath: string) => Promise<void>

  /** 开始重命名 */
  startRename: (filePath: string) => void

  /** 确认重命名 */
  confirmRename: () => Promise<void>

  /** 取消重命名 */
  cancelRename: () => void

  /** 创建文件 */
  createFile: () => Promise<void>

  /** 从本地保存的数据初始化 */
  initFromSaved: () => Promise<void>

  /** 刷新文件列表 */
  refreshFiles: (options?: { type?: FolderType; updateContent?: boolean }) => Promise<void>

  /** 设置文件内容 */
  setContent: (content: string) => void

  /** 设置 renameValue */
  setRenameValue: (v: string) => void

  /** 设置 newFileName */
  setNewFileName: (v: string) => void

  /** 设置 isCreatingFile */
  setIsCreatingFile: (v: boolean) => void

  /** 开始创建文件（显示输入框） */
  startCreateFile: () => void

  /** 取消创建文件 */
  cancelCreateFile: () => void

  /** 修改展开状态 */
  setExpanded: (v: ExpandedType) => void
}
